<?php

/**
 * 根据地理坐标获取国家、省份、城市，及周边数据类(利用百度Geocoding API实现)
 * 百度密钥获取方法：http://lbsyun.baidu.com/apiconsole/key?application=key（需要先注册百度开发者账号）
 * Date:    2015-07-30
 * Author:  fdipzone
 * Ver: 1.0
 *
 * Func:
 * Public  getAddressComponent 根据地址获取国家、省份、城市及周边数据
 * Private toCurl              使用curl调用百度Geocoding API
 */
class getCoorAddress
{
    // 百度Geocoding API
    const API = 'http://api.map.baidu.com/geocoder/v2/';

    // 不显示周边数据
    const NO_POIS = 0;

    // 显示周边数据
    const POIS = 1;

    /**
     * @param $longitude
     * @param $latitude
     * @return array
     *
     * 通过经纬度来获取地理位置
     */
    public static function getAddress($longitude, $latitude)
    {
        $ak = 'sOgiXqjWFE6kRquDfn1UH0bFgdwy13mh';
        $result = getCoorAddress::getAddressComponent($ak, $longitude, $latitude, getCoorAddress::NO_POIS);
        $returnArr["province"] = $result["result"]["addressComponent"]["province"];//iconv("UTF-8", "GB2312", $result["result"]["addressComponent"]["province"]);
        $returnArr["city"] = $result["result"]["addressComponent"]["city"];//iconv("UTF-8", "GB2312", $result["result"]["addressComponent"]["city"]);
        return $returnArr;
    }

    /**
     * @param int $type
     * @param bool $adv
     * @return mixed
     *
     * 获取IP地址
     */
    public static function getClientIp($type = 0, $adv = false)
    {
        $type = $type ? 1 : 0;
        static $ip = NULL;
        if ($ip !== NULL)
            return $ip[$type];
        if ($adv) {
            if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
                $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
                $pos = array_search('unknown', $arr);
                if (false !== $pos)
                    unset($arr[$pos]);
                $ip = trim($arr[0]);
            } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
                $ip = $_SERVER['HTTP_CLIENT_IP'];
            } elseif (isset($_SERVER['REMOTE_ADDR'])) {
                $ip = $_SERVER['REMOTE_ADDR'];
            }
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        $long = sprintf("%u", ip2long($ip));
        $ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
        return $ip[$type];
    }

    /**
     * 根据地址获取国家、省份、城市及周边数据
     * @param  String $ak 百度ak(密钥)
     * @param  Decimal $longitude 经度
     * @param  Decimal $latitude 纬度
     * @param  Int $pois 是否显示周边数据
     * @return Array
     */
    public static function getAddressComponent($ak, $longitude, $latitude, $pois = self::NO_POIS)
    {
        $param = array(
            'ak' => $ak,
            'location' => implode(',', array($latitude, $longitude)),
            'pois' => $pois,
            'output' => 'json'
        );

        // 请求百度api
        $response = self::toCurl(self::API, $param);

        $result = array();

        if ($response) {
            $result = json_decode($response, true);
        }

        return $result;
    }

    /**
     * 使用curl调用百度Geocoding API
     * @param  String $url 请求的地址
     * @param  Array $param 请求的参数
     * @return JSON
     */
    private static function toCurl($url, $param = array())
    {
        $ch = curl_init();

        if (substr($url, 0, 5) == 'https') {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);  // 从证书中检查SSL加密算法是否存在
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));

        $response = curl_exec($ch);

        if ($error = curl_error($ch)) {
            return false;
        }

        curl_close($ch);

        return $response;
    }

}

?>